package pe.gob.osce.sirenas.dao.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.FichaArbitralDAOLocal;
import pe.gob.osce.sirenas.dao.convert.AcreditacionConvert;
import pe.gob.osce.sirenas.dao.convert.FichaArbitralConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.FichaArbitralDTO;
import pe.gob.osce.sirenas.model.jpa.Acreditacion;
import pe.gob.osce.sirenas.model.jpa.FichaArbitral;
import pe.gob.osce.sirenas.model.jpa.HistorialEstado;
import pe.gob.osce.sirenas.model.jpa.Persona;
import pe.gob.osce.sirenas.model.reporte.DataReporteDTO;
import pe.gob.osce.sirenas.model.reporte.FiltroReporteDTO;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;


@Stateless
public class FichaArbitralDAOImpl implements FichaArbitralDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);

	@Override
	public FichaArbitral insertarFicha(FichaArbitral  fichaArbitral ) throws Exception {
		try{
			em.merge(fichaArbitral);
			em.flush();
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		return fichaArbitral;
	}
	

	@Override 
	public Integer obtenerCantidadTotalFichas() throws Exception {
		Integer cantidad=0;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT COUNT(fa.idFicha) FROM FichaArbitral fa WHERE  fa.idEstadoFicha!=1 AND fa.estado=1 ");//Solo Fichas Registradas
			
			
			Query	query= em.createQuery( jpql.toString() );
			
			Object valor=(Object)query.getSingleResult();			
			cantidad=((Long)valor).intValue();
			
		} catch (NoResultException nre) {
			cantidad=0;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return cantidad;
	}	
	
	
	@Override 
	public FichaArbitralDTO obtenerFichaArbitral(Long idFicha,Long numRuc, String tipoFicha)
			throws Exception {
		FichaArbitralDTO		fichaArbitralDTO=null;
		FichaArbitral fichaArbitralJPA =new FichaArbitral();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fa,pe,lhist FROM FichaArbitral fa JOIN fa.persona pe JOIN fa.listaHistorialEstado lhist WHERE  fa.estado=1 ");
			
			if(idFicha!=null){jpql.append(" AND fa.idFicha = :idFicha");}
			if(numRuc!=null){jpql.append(" AND fa.persona.numRuc = :numRuc AND fa.tipoFicha =:tipoFicha"); }
			
			Query	query= em.createQuery( jpql.toString() );
			
			if(idFicha!=null){	query.setParameter("idFicha", idFicha);}
			if(numRuc!=null){	query.setParameter("numRuc", numRuc); query.setParameter("tipoFicha", tipoFicha);}
			
			List<Object[]>	listaObjeto=(List<Object[]>)query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				Persona personaJPA = new Persona();
				List<HistorialEstado> listaHistorialEstadoJPA = new ArrayList<HistorialEstado>();
				for (Object obj [] : listaObjeto) {					
					fichaArbitralJPA=(FichaArbitral)obj[0];				
					personaJPA=(Persona)obj[1];		
					listaHistorialEstadoJPA.add((HistorialEstado)obj[2]);
				}	
				fichaArbitralJPA.setPersona(personaJPA);
				fichaArbitralJPA.setListaHistorialEstado(listaHistorialEstadoJPA);
				fichaArbitralDTO=FichaArbitralConvert.createDTO(fichaArbitralJPA);
			}
			
		} catch (NoResultException nre) {
			fichaArbitralDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return fichaArbitralDTO;
	}	
	

	@Override 
	public List<FichaArbitralDTO> obtenerReporteCabecera(FiltroReporteDTO filtroReporteDTO) throws Exception {
		List<FichaArbitralDTO> listaFichasReporte=new ArrayList<FichaArbitralDTO>();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fa,pe FROM FichaArbitral fa JOIN fa.persona pe JOIN pe.listaDomicilio dom WHERE fa.estado=1 AND pe.estado=1 AND dom.estado=1 ");
			
			if(filtroReporteDTO.getIdRegion()!=null && filtroReporteDTO.getIdRegion()>0)
				jpql.append(" AND dom.idRegion = :idRegion");
			if(filtroReporteDTO.getIdProvincia()!=null && filtroReporteDTO.getIdProvincia()>0)
				jpql.append(" AND dom.idProvincia = :idProvincia");
			
			if(filtroReporteDTO.getEdad()!=null && filtroReporteDTO.getEdad()>0)
				jpql.append(" AND  pe.fecNacimiento BETWEEN :fecInicio AND CURRENT_TIMESTAMP");
			if(filtroReporteDTO.getIndModalidadArbitro()!=null && filtroReporteDTO.getIndModalidadArbitro()>0)
				jpql.append(" AND fa.indModalidadArbitro=:indModalidadArbitro");
			
			Query	query= em.createQuery( jpql.toString() );

			if(filtroReporteDTO.getIdRegion()!=null && filtroReporteDTO.getIdRegion()>0)
				query.setParameter("idRegion",filtroReporteDTO.getIdRegion() ); 
			if(filtroReporteDTO.getIdProvincia()!=null && filtroReporteDTO.getIdProvincia()>0)
				query.setParameter("idProvincia",filtroReporteDTO.getIdProvincia()); 

			if(filtroReporteDTO.getEdad()!=null && filtroReporteDTO.getEdad()>0){ 
				Calendar minDate = Calendar.getInstance(); 
				minDate.add(Calendar.YEAR, -filtroReporteDTO.getEdad());
				
				query.setParameter("fecInicio",minDate.getTime() );  
			}
			if(filtroReporteDTO.getIndModalidadArbitro()!=null && filtroReporteDTO.getIndModalidadArbitro()>0){ 
				query.setParameter("indModalidadArbitro",filtroReporteDTO.getIndModalidadArbitro() ); 
			}
						
			List<Object[]>	listaObjeto=(List<Object[]>)query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				for (Object obj [] : listaObjeto) {					
					listaFichasReporte.add(FichaArbitralConvert.createDTO((Persona)obj[1], (FichaArbitral)obj[0]));
				}	
			}
			
		} catch (NoResultException nre) {
			listaFichasReporte=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}		
		return listaFichasReporte;
	}
	
	
}
